package com.idis.service;

import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.idis.common.dictionary.PersonRole;
import com.idis.entity.person;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.ParameterizedTypeReference;
import org.springframework.http.HttpMethod;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;

import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * Created by LJH on 2018/1/26.
 */

/**
 * 人员信息服务
 */
@Service
public class PersonService {

    @Autowired
    RestTemplate restTemplate;

    @Autowired
    String DBUrl;

    private final String PERSON="/person";

    private final String FIND_ALL="/all";

    private final String SAVE="/save";

    private final String UPDATE_NOT_NULL="/updatenotnull";

    private final String UPDATE="/update";

    private final String FIND_BY_PROP="/findbyproperty";

    private final String DELETE="/delete";

    /**
     * 获取所有人员信息
     * @return 人员信息集
     */
    public List<person> findAll(){
        List<person> persons;
        persons = restTemplate.exchange(DBUrl+PERSON+FIND_ALL, HttpMethod.GET, null, new ParameterizedTypeReference<ArrayList<person>>(){}).getBody();
        return persons;
    }
    /**
     * 插入新人员记录
     * @param person 人员信息
     * @return 成功插入的数量
     */
    public Integer savaPerson(person person){
        return restTemplate.postForObject(DBUrl+PERSON+SAVE,person,Integer.class);
    }

    /**
     * 更新人员信息，ID必需
     * @param person 人员信息
     * @return 成功更新的数量
     */
    public Integer update(person person){
        return restTemplate.postForObject(DBUrl+PERSON+UPDATE,person,Integer.class);
    }

    /**
     * 根据ID删除人员信息
     * @param person 人员信息，必须包含id
     * @return 成功删除的数量
     */
    public Integer delete(person person){
        return restTemplate.postForObject(DBUrl+PERSON+DELETE,person,Integer.class);
    }

    /**
     * 更新指导老师信息，ID必须
     * @param person 人员信息
     * @return 成功更新的数量
     */
    public Integer updateTeacher(person person){
        person.setType(2);
        return restTemplate.postForObject(DBUrl+PERSON+UPDATE,person,Integer.class);
    }

    /**
     * 更新成员信息，ID必需
     * @param person 人员信息
     * @return 成功更新的数量
     */
    public Integer updateMember(person person){
        person.setType(1);
        return restTemplate.postForObject(DBUrl+PERSON+UPDATE,person,Integer.class);
    }

    /**
     * 更新人员信息，仅更新非空属性，ID必须
     * @param person 人员信息
     * @return 成功更新的数量
     */
    public Integer updateNotNull(person person){
        return restTemplate.postForObject(DBUrl+PERSON+UPDATE_NOT_NULL,person,Integer.class);
    }

    /**
     * 根据examole有效属性值搜索人员，空信息无效
     * @param example 人员信息
     * @return 人员信息集
     */
    public List<person> findByProperty(person example){
        ArrayList<person> persons = null;
        String json= restTemplate.postForObject(DBUrl+PERSON+FIND_BY_PROP,example,String.class);
        ObjectMapper objectMapper=new ObjectMapper();
        try {
            persons =
                    objectMapper.readValue(json, new TypeReference<ArrayList<person>>(){});
        } catch (IOException e) {
            e.printStackTrace();
        }
        return persons;
    }

    /**
     * 获取人员角色类型及代号
     * @return [{代号：人员角色类型}]
     */
    public Map getRole(){
        Map roles=new HashMap();
        for (PersonRole role: PersonRole.values()) {
            roles.put(role.getCode(),role.getMessage());
        }
        return roles;
    }

    /**
     * 根据ID查询人员
     * @param id 人员ID
     * @return 人员信息
     */
    public person findById(String id){
        person person=new person();
        person.setId(Integer.valueOf(id));
        List<com.idis.entity.person> persons=findByProperty(person);
        if(persons.size()>0)
            return persons.get(0);
        else
            return null;
    }

    /**
     * 获取所有指导老师信息
     * @return 指导老师信息集
     */
    public List<person> findAllTeacher(){
        person person=new person();
        //teacher的type为1
        person.setType(2);
        List<com.idis.entity.person> persons= null;
        persons = findByProperty(person);
        if(persons.size()>0)
            return persons;
        else
            return null;
    }

    /**
     * 获取所有成员信息
     * @return 成员信息集
     */
    public List<person> findAllStudent(){
        person person=new person();
        //student的type为2
        person.setType(1);
        List<com.idis.entity.person> persons= null;
        persons = findByProperty(person);
        if(persons.size()>0)
            return persons;
        else
            return null;
    }

    /**
     * 获取所有指导老师信息
     * @return 指导老师信息集
     */
    public List<person> findTeacher(){
        person person=new person();
        person.setType(PersonRole.TEACHER.getCode());
        return findByProperty(person);
    }

    /**
     * 获取所有指导老师信息
     * @return 指导老师信息集
     */
    public List<person> findMember(){
        person person=new person();
        person.setType(PersonRole.MEMBER.getCode());
        return findByProperty(person);
    }

    /**
     * 插入新指导老师记录
     * @param teacher 指导老师信息
     * @return 成功插入的数量
     */
    public Integer saveTeacher(person teacher){
        teacher.setType(PersonRole.TEACHER.getCode());
        return savaPerson(teacher);
    }

    /**
     * 插入新成员记录
     * @param member 成员信息
     * @return 成功插入的数量
     */
    public Integer saveMember(person member){
        member.setType(PersonRole.MEMBER.getCode());
        return savaPerson(member);
    }

//    public Integer saveImg(){
//        return
//    }

}
